<?php
namespace app\common\exception;

use think\exception\Handle;
use Exception;
use think\Config;
use think\Log;
use think\Request;
use think\Response;

/**
 * 安全的异常处理类
 * 用于替代ThinkPHP默认的异常处理
 */
class SecureExceptionHandler extends Handle
{
    /**
     * 渲染异常
     * @param Exception $e 异常对象
     * @return Response
     */
    public function render(Exception $e)
    {
        // 获取当前是否为调试模式
        $debug = Config::get('app_debug');
        
        // 记录日志
        Log::record($e->getMessage() . "\n" . $e->getTraceAsString(), 'error');
        
        // 获取当前请求
        $request = Request::instance();
        
        // 如果是API请求，返回JSON格式错误
        if ($request->isAjax() || strpos($request->header('accept'), 'application/json') !== false) {
            $data = [
                'code' => $e->getCode() ?: 500,
                'msg'  => $debug ? $e->getMessage() : '服务器内部错误，请联系管理员',
                'data' => []
            ];
            
            // 在调试模式下，添加更多信息
            if ($debug) {
                $data['file'] = $e->getFile();
                $data['line'] = $e->getLine();
                $data['trace'] = explode("\n", $e->getTraceAsString());
            }
            
            return Response::create($data, 'json');
        }
        
        // 普通请求，显示错误页面
        if ($e instanceof \think\exception\HttpException) {
            $statusCode = $e->getStatusCode();
        } else {
            $statusCode = 500;
        }
        
        // 设置HTTP状态码
        http_response_code($statusCode);
        
        // 根据状态码显示不同的错误页面
        if ($statusCode == 404) {
            return Response::create(file_get_contents(APP_PATH . 'admin/view/base/404.html'), 'html');
        } else {
            return Response::create(file_get_contents(APP_PATH . 'admin/view/base/500.html'), 'html');
        }
    }
}